﻿using System;
using System.Collections.Generic;
using Asistente.Model.IFPUG;
using System.Xml.Serialization;
using Asistente.Model.General;

namespace Asistente.Model.Representation
{
    //Representa un control perteneciente a un panel

    public class Control : IElement
    {
        public Int32 Quantity { get; set; }
        public string Name { get; set ; }

        [XmlIgnore] public string LongName
        {
            get { return Name + " :" + ControlPattern + " (" + Quantity + ')'; }
        }

        public ControlPattern ControlPattern { get; set; }
        public DataGroup DataGroup { get; set; }
        

        //Los unicos dos tipos de control que generan funciones transaccionales son
        //Autocompelte y DropDownChooser 

        public IMeasurable ConvertToIfpugModel(IfpugModel ifpugModel)
        {
            //Se crea el TransformedControl
            TransformedControl transformedControl = new TransformedControl
            {
                Control = this,
                TransactionalFunction = { Type = TransactionalFunctionType.Eq }
            };

            //Se asignan DET y FTR
            transformedControl.AddDet(GetDets());
            transformedControl.AddFtr(GetFtrs());

            ifpugModel.Add(transformedControl);
            return ifpugModel;
        }

        private int GetFtrs()
        {
            //Los controles que generan una funcion transaccional son
            //Autocomplete
            //DropDownChooser

            // El aporte en FTR esta dado por la cantidad de entidades referenciadas por el control
            return CountReferencedEntities();
        }

        private int GetDets()
        {
            //Los controles que generan una funcion transaccional son
            //Autocomplete
            //DropDownChooser

            // Todos aportan un DET. uno por el campo unico de salida reconocible por el usuario, y otro
            // por la psibilidad de tomar la accion de seleccionar (flecha hacia abajo, o escribir una letra en autocomplete).
            return 2;
        }

        //Se retorna la cantidad de entidades referenciadas en la propiedad DataGroup
        private int CountReferencedEntities()
        {
            List<Entity> entities = new List<Entity>();

            if (DataGroup != null)
            {
                if (DataGroup.GetType() == typeof(Query))
                {
                    // El data group es un query
                    Query query = DataGroup as Query;
                    if (query != null) entities.AddRange(query.UsedEntities);
                }
                else
                {
                    //El data group es una entidad
                    entities.Add(DataGroup as Entity);
                }
            }
            return entities.Count;
        }
    }
}
